package ar.uba.is2.ec.trmanager;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import ar.uba.is2.common.Const;
import ar.uba.is2.common.mensaje.DatoSensado;
import ar.uba.is2.common.mensaje.Mensaje;
import ar.uba.is2.common.mensaje.Receptor;
import ar.uba.is2.common.mensaje.TipoMensaje;
import ar.uba.is2.common.mensaje.contenido.ContenidoDatoSuscripto;
import ar.uba.is2.common.mensaje.contenido.ContenidoDatosSensados;
import ar.uba.is2.common.mensaje.contenido.Identificador;
import ar.uba.is2.common.mensaje.contenido.TipoDato;
import ar.uba.is2.ec.config.Contexto;
import ar.uba.is2.ec.matem.dao.MedicionDao;
import ar.uba.is2.ec.matem.datos.Medicion;
import ar.uba.is2.ec.scmanager.ReceptorSuscripcionDeDatos;

public class ReceptorPersistenciaMensaje implements Receptor {
	
	private static int nroMensaje = 0;
	

	private static final Logger log = Logger.getLogger(ReceptorPersistenciaMensaje.class);
	private MedicionDao dao;
	private static long ID_MEDICION;
	
	public ReceptorPersistenciaMensaje(MedicionDao dao) {
		this.dao = dao;
	}
	
	public void recibirMensaje(Mensaje mensaje) {
		List<DatoSensado> datos = ((ContenidoDatosSensados) mensaje.getContenido()).getContenido();
		for (DatoSensado datoSensado : datos) {
			Medicion medicion = transformarAMedicion(datoSensado, mensaje);
			dao.guardar(medicion);
			
			reenviarSuscripcionExterna(medicion);
			
			log.debug("Se guarda la medicion " + medicion.getId() + "con exito. El id sensor es:" + medicion.getId());
		}
	}

	private void reenviarSuscripcionExterna(Medicion medicion) {
		Identificador identificador = new Identificador(TipoDato.MEDICION, Contexto.instance.getConfiguracionGeneralEC().getCoordenada(), medicion.getTipoMedicion());
		
		if (ReceptorSuscripcionDeDatos.identificadoresSuscriptos.contains(identificador)) {
			Mensaje msj = new Mensaje();
			
			msj.setOrigen(Contexto.instance.getConfiguracionGeneralEC().getComponenteEc());
			msj.setDestino(Const.COMPONENTE_SERVIDOR_CENTRAL);
			msj.setNumeroMensaje(nroMensaje++);
			msj.setFechaCreacion(new Date());
			msj.setTipoMensaje(TipoMensaje.DATOS_SUSCRIPTOS);
			
			ContenidoDatoSuscripto cont = new ContenidoDatoSuscripto();
			
			cont.setIdentificador(identificador);
			cont.setValor(String.valueOf(medicion.getValor()));
			
			msj.setContenido(cont);
			
			Contexto.instance.getProtocoloSC().enviarMensaje(msj);
		}
	}

	private Medicion transformarAMedicion(DatoSensado datoSensado,
			Mensaje mensaje) {
		
		Medicion medicion = new Medicion();

		medicion.setId(ID_MEDICION++);
		medicion.setNombreTr(mensaje.getOrigen().getNombre());
		medicion.setTipoMedicion(String.valueOf(datoSensado.getIdSensor()));
		medicion.setValor(datoSensado.getValor());
		medicion.setFecha(datoSensado.getFechaSensada());
		
		return medicion;
	}

}
